package org.dslintegration.parser.antlr.internal; 

import org.eclipse.xtext.*;
import org.eclipse.xtext.parser.*;
import org.eclipse.xtext.parser.impl.*;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
import org.eclipse.xtext.parser.antlr.XtextTokenStream;
import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
import org.dslintegration.services.KM3GrammarAccess;



import org.antlr.runtime.*;
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings("all")
public class InternalKM3Parser extends AbstractInternalAntlrParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_INT", "RULE_STRING", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'package'", "'{'", "'}'", "'abstract'", "'class'", "'extends'", "'attribute'", "':'", "';'", "'reference'", "'container'", "'oppositeOf'", "'['", "'-'", "'*'", "']'", "'ordered'", "'datatype'", "'enumeration'", "'literal'"
    };
    public static final int RULE_ID=4;
    public static final int T__29=29;
    public static final int T__28=28;
    public static final int T__27=27;
    public static final int T__26=26;
    public static final int T__25=25;
    public static final int T__24=24;
    public static final int T__23=23;
    public static final int T__22=22;
    public static final int RULE_ANY_OTHER=10;
    public static final int T__21=21;
    public static final int T__20=20;
    public static final int RULE_SL_COMMENT=8;
    public static final int EOF=-1;
    public static final int RULE_ML_COMMENT=7;
    public static final int T__30=30;
    public static final int T__19=19;
    public static final int RULE_STRING=6;
    public static final int T__16=16;
    public static final int T__15=15;
    public static final int T__18=18;
    public static final int T__17=17;
    public static final int T__12=12;
    public static final int T__11=11;
    public static final int T__14=14;
    public static final int T__13=13;
    public static final int RULE_INT=5;
    public static final int RULE_WS=9;

    // delegates
    // delegators


        public InternalKM3Parser(TokenStream input) {
            this(input, new RecognizerSharedState());
        }
        public InternalKM3Parser(TokenStream input, RecognizerSharedState state) {
            super(input, state);
             
        }
        

    public String[] getTokenNames() { return InternalKM3Parser.tokenNames; }
    public String getGrammarFileName() { return "../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g"; }



     	private KM3GrammarAccess grammarAccess;
     	
        public InternalKM3Parser(TokenStream input, KM3GrammarAccess grammarAccess) {
            this(input);
            this.grammarAccess = grammarAccess;
            registerRules(grammarAccess.getGrammar());
        }
        
        @Override
        protected String getFirstRuleName() {
        	return "Metamodel";	
       	}
       	
       	@Override
       	protected KM3GrammarAccess getGrammarAccess() {
       		return grammarAccess;
       	}



    // $ANTLR start "entryRuleMetamodel"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:67:1: entryRuleMetamodel returns [EObject current=null] : iv_ruleMetamodel= ruleMetamodel EOF ;
    public final EObject entryRuleMetamodel() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMetamodel = null;


        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:68:2: (iv_ruleMetamodel= ruleMetamodel EOF )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:69:2: iv_ruleMetamodel= ruleMetamodel EOF
            {
             newCompositeNode(grammarAccess.getMetamodelRule()); 
            pushFollow(FOLLOW_ruleMetamodel_in_entryRuleMetamodel75);
            iv_ruleMetamodel=ruleMetamodel();

            state._fsp--;

             current =iv_ruleMetamodel; 
            match(input,EOF,FOLLOW_EOF_in_entryRuleMetamodel85); 

            }

        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleMetamodel"


    // $ANTLR start "ruleMetamodel"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:76:1: ruleMetamodel returns [EObject current=null] : ( (lv_packages_0_0= rulePackage ) )* ;
    public final EObject ruleMetamodel() throws RecognitionException {
        EObject current = null;

        EObject lv_packages_0_0 = null;


         enterRule(); 
            
        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:79:28: ( ( (lv_packages_0_0= rulePackage ) )* )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:80:1: ( (lv_packages_0_0= rulePackage ) )*
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:80:1: ( (lv_packages_0_0= rulePackage ) )*
            loop1:
            do {
                int alt1=2;
                int LA1_0 = input.LA(1);

                if ( (LA1_0==11) ) {
                    alt1=1;
                }


                switch (alt1) {
            	case 1 :
            	    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:81:1: (lv_packages_0_0= rulePackage )
            	    {
            	    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:81:1: (lv_packages_0_0= rulePackage )
            	    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:82:3: lv_packages_0_0= rulePackage
            	    {
            	     
            	    	        newCompositeNode(grammarAccess.getMetamodelAccess().getPackagesPackageParserRuleCall_0()); 
            	    	    
            	    pushFollow(FOLLOW_rulePackage_in_ruleMetamodel130);
            	    lv_packages_0_0=rulePackage();

            	    state._fsp--;


            	    	        if (current==null) {
            	    	            current = createModelElementForParent(grammarAccess.getMetamodelRule());
            	    	        }
            	           		add(
            	           			current, 
            	           			"packages",
            	            		lv_packages_0_0, 
            	            		"Package");
            	    	        afterParserOrEnumRuleCall();
            	    	    

            	    }


            	    }
            	    break;

            	default :
            	    break loop1;
                }
            } while (true);


            }

             leaveRule(); 
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleMetamodel"


    // $ANTLR start "entryRulePackage"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:106:1: entryRulePackage returns [EObject current=null] : iv_rulePackage= rulePackage EOF ;
    public final EObject entryRulePackage() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePackage = null;


        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:107:2: (iv_rulePackage= rulePackage EOF )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:108:2: iv_rulePackage= rulePackage EOF
            {
             newCompositeNode(grammarAccess.getPackageRule()); 
            pushFollow(FOLLOW_rulePackage_in_entryRulePackage166);
            iv_rulePackage=rulePackage();

            state._fsp--;

             current =iv_rulePackage; 
            match(input,EOF,FOLLOW_EOF_in_entryRulePackage176); 

            }

        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRulePackage"


    // $ANTLR start "rulePackage"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:115:1: rulePackage returns [EObject current=null] : (otherlv_0= 'package' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_classifiers_3_0= ruleClassifier ) )* otherlv_4= '}' ) ;
    public final EObject rulePackage() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_classifiers_3_0 = null;


         enterRule(); 
            
        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:118:28: ( (otherlv_0= 'package' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_classifiers_3_0= ruleClassifier ) )* otherlv_4= '}' ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:119:1: (otherlv_0= 'package' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_classifiers_3_0= ruleClassifier ) )* otherlv_4= '}' )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:119:1: (otherlv_0= 'package' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_classifiers_3_0= ruleClassifier ) )* otherlv_4= '}' )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:119:3: otherlv_0= 'package' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_classifiers_3_0= ruleClassifier ) )* otherlv_4= '}'
            {
            otherlv_0=(Token)match(input,11,FOLLOW_11_in_rulePackage213); 

                	newLeafNode(otherlv_0, grammarAccess.getPackageAccess().getPackageKeyword_0());
                
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:123:1: ( (lv_name_1_0= RULE_ID ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:124:1: (lv_name_1_0= RULE_ID )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:124:1: (lv_name_1_0= RULE_ID )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:125:3: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_rulePackage230); 

            			newLeafNode(lv_name_1_0, grammarAccess.getPackageAccess().getNameIDTerminalRuleCall_1_0()); 
            		

            	        if (current==null) {
            	            current = createModelElement(grammarAccess.getPackageRule());
            	        }
                   		setWithLastConsumed(
                   			current, 
                   			"name",
                    		lv_name_1_0, 
                    		"ID");
            	    

            }


            }

            otherlv_2=(Token)match(input,12,FOLLOW_12_in_rulePackage247); 

                	newLeafNode(otherlv_2, grammarAccess.getPackageAccess().getLeftCurlyBracketKeyword_2());
                
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:145:1: ( (lv_classifiers_3_0= ruleClassifier ) )*
            loop2:
            do {
                int alt2=2;
                int LA2_0 = input.LA(1);

                if ( ((LA2_0>=14 && LA2_0<=15)||(LA2_0>=28 && LA2_0<=29)) ) {
                    alt2=1;
                }


                switch (alt2) {
            	case 1 :
            	    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:146:1: (lv_classifiers_3_0= ruleClassifier )
            	    {
            	    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:146:1: (lv_classifiers_3_0= ruleClassifier )
            	    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:147:3: lv_classifiers_3_0= ruleClassifier
            	    {
            	     
            	    	        newCompositeNode(grammarAccess.getPackageAccess().getClassifiersClassifierParserRuleCall_3_0()); 
            	    	    
            	    pushFollow(FOLLOW_ruleClassifier_in_rulePackage268);
            	    lv_classifiers_3_0=ruleClassifier();

            	    state._fsp--;


            	    	        if (current==null) {
            	    	            current = createModelElementForParent(grammarAccess.getPackageRule());
            	    	        }
            	           		add(
            	           			current, 
            	           			"classifiers",
            	            		lv_classifiers_3_0, 
            	            		"Classifier");
            	    	        afterParserOrEnumRuleCall();
            	    	    

            	    }


            	    }
            	    break;

            	default :
            	    break loop2;
                }
            } while (true);

            otherlv_4=(Token)match(input,13,FOLLOW_13_in_rulePackage281); 

                	newLeafNode(otherlv_4, grammarAccess.getPackageAccess().getRightCurlyBracketKeyword_4());
                

            }


            }

             leaveRule(); 
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePackage"


    // $ANTLR start "entryRuleClassifier"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:175:1: entryRuleClassifier returns [EObject current=null] : iv_ruleClassifier= ruleClassifier EOF ;
    public final EObject entryRuleClassifier() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleClassifier = null;


        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:176:2: (iv_ruleClassifier= ruleClassifier EOF )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:177:2: iv_ruleClassifier= ruleClassifier EOF
            {
             newCompositeNode(grammarAccess.getClassifierRule()); 
            pushFollow(FOLLOW_ruleClassifier_in_entryRuleClassifier317);
            iv_ruleClassifier=ruleClassifier();

            state._fsp--;

             current =iv_ruleClassifier; 
            match(input,EOF,FOLLOW_EOF_in_entryRuleClassifier327); 

            }

        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleClassifier"


    // $ANTLR start "ruleClassifier"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:184:1: ruleClassifier returns [EObject current=null] : (this_KM3Class_0= ruleKM3Class | this_Datatype_1= ruleDatatype | this_Enumeration_2= ruleEnumeration ) ;
    public final EObject ruleClassifier() throws RecognitionException {
        EObject current = null;

        EObject this_KM3Class_0 = null;

        EObject this_Datatype_1 = null;

        EObject this_Enumeration_2 = null;


         enterRule(); 
            
        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:187:28: ( (this_KM3Class_0= ruleKM3Class | this_Datatype_1= ruleDatatype | this_Enumeration_2= ruleEnumeration ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:188:1: (this_KM3Class_0= ruleKM3Class | this_Datatype_1= ruleDatatype | this_Enumeration_2= ruleEnumeration )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:188:1: (this_KM3Class_0= ruleKM3Class | this_Datatype_1= ruleDatatype | this_Enumeration_2= ruleEnumeration )
            int alt3=3;
            switch ( input.LA(1) ) {
            case 14:
            case 15:
                {
                alt3=1;
                }
                break;
            case 28:
                {
                alt3=2;
                }
                break;
            case 29:
                {
                alt3=3;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 3, 0, input);

                throw nvae;
            }

            switch (alt3) {
                case 1 :
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:189:5: this_KM3Class_0= ruleKM3Class
                    {
                     
                            newCompositeNode(grammarAccess.getClassifierAccess().getKM3ClassParserRuleCall_0()); 
                        
                    pushFollow(FOLLOW_ruleKM3Class_in_ruleClassifier374);
                    this_KM3Class_0=ruleKM3Class();

                    state._fsp--;

                     
                            current = this_KM3Class_0; 
                            afterParserOrEnumRuleCall();
                        

                    }
                    break;
                case 2 :
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:199:5: this_Datatype_1= ruleDatatype
                    {
                     
                            newCompositeNode(grammarAccess.getClassifierAccess().getDatatypeParserRuleCall_1()); 
                        
                    pushFollow(FOLLOW_ruleDatatype_in_ruleClassifier401);
                    this_Datatype_1=ruleDatatype();

                    state._fsp--;

                     
                            current = this_Datatype_1; 
                            afterParserOrEnumRuleCall();
                        

                    }
                    break;
                case 3 :
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:209:5: this_Enumeration_2= ruleEnumeration
                    {
                     
                            newCompositeNode(grammarAccess.getClassifierAccess().getEnumerationParserRuleCall_2()); 
                        
                    pushFollow(FOLLOW_ruleEnumeration_in_ruleClassifier428);
                    this_Enumeration_2=ruleEnumeration();

                    state._fsp--;

                     
                            current = this_Enumeration_2; 
                            afterParserOrEnumRuleCall();
                        

                    }
                    break;

            }


            }

             leaveRule(); 
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleClassifier"


    // $ANTLR start "entryRuleKM3Class"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:225:1: entryRuleKM3Class returns [EObject current=null] : iv_ruleKM3Class= ruleKM3Class EOF ;
    public final EObject entryRuleKM3Class() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleKM3Class = null;


        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:226:2: (iv_ruleKM3Class= ruleKM3Class EOF )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:227:2: iv_ruleKM3Class= ruleKM3Class EOF
            {
             newCompositeNode(grammarAccess.getKM3ClassRule()); 
            pushFollow(FOLLOW_ruleKM3Class_in_entryRuleKM3Class463);
            iv_ruleKM3Class=ruleKM3Class();

            state._fsp--;

             current =iv_ruleKM3Class; 
            match(input,EOF,FOLLOW_EOF_in_entryRuleKM3Class473); 

            }

        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleKM3Class"


    // $ANTLR start "ruleKM3Class"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:234:1: ruleKM3Class returns [EObject current=null] : ( ( (lv_abstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= RULE_ID ) ) (otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) ) )? otherlv_5= '{' ( (lv_features_6_0= ruleFeature ) )* otherlv_7= '}' ) ;
    public final EObject ruleKM3Class() throws RecognitionException {
        EObject current = null;

        Token lv_abstract_0_0=null;
        Token otherlv_1=null;
        Token lv_name_2_0=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        EObject lv_features_6_0 = null;


         enterRule(); 
            
        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:237:28: ( ( ( (lv_abstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= RULE_ID ) ) (otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) ) )? otherlv_5= '{' ( (lv_features_6_0= ruleFeature ) )* otherlv_7= '}' ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:238:1: ( ( (lv_abstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= RULE_ID ) ) (otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) ) )? otherlv_5= '{' ( (lv_features_6_0= ruleFeature ) )* otherlv_7= '}' )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:238:1: ( ( (lv_abstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= RULE_ID ) ) (otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) ) )? otherlv_5= '{' ( (lv_features_6_0= ruleFeature ) )* otherlv_7= '}' )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:238:2: ( (lv_abstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= RULE_ID ) ) (otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) ) )? otherlv_5= '{' ( (lv_features_6_0= ruleFeature ) )* otherlv_7= '}'
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:238:2: ( (lv_abstract_0_0= 'abstract' ) )?
            int alt4=2;
            int LA4_0 = input.LA(1);

            if ( (LA4_0==14) ) {
                alt4=1;
            }
            switch (alt4) {
                case 1 :
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:239:1: (lv_abstract_0_0= 'abstract' )
                    {
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:239:1: (lv_abstract_0_0= 'abstract' )
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:240:3: lv_abstract_0_0= 'abstract'
                    {
                    lv_abstract_0_0=(Token)match(input,14,FOLLOW_14_in_ruleKM3Class516); 

                            newLeafNode(lv_abstract_0_0, grammarAccess.getKM3ClassAccess().getAbstractAbstractKeyword_0_0());
                        

                    	        if (current==null) {
                    	            current = createModelElement(grammarAccess.getKM3ClassRule());
                    	        }
                           		setWithLastConsumed(current, "abstract", true, "abstract");
                    	    

                    }


                    }
                    break;

            }

            otherlv_1=(Token)match(input,15,FOLLOW_15_in_ruleKM3Class542); 

                	newLeafNode(otherlv_1, grammarAccess.getKM3ClassAccess().getClassKeyword_1());
                
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:257:1: ( (lv_name_2_0= RULE_ID ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:258:1: (lv_name_2_0= RULE_ID )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:258:1: (lv_name_2_0= RULE_ID )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:259:3: lv_name_2_0= RULE_ID
            {
            lv_name_2_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleKM3Class559); 

            			newLeafNode(lv_name_2_0, grammarAccess.getKM3ClassAccess().getNameIDTerminalRuleCall_2_0()); 
            		

            	        if (current==null) {
            	            current = createModelElement(grammarAccess.getKM3ClassRule());
            	        }
                   		setWithLastConsumed(
                   			current, 
                   			"name",
                    		lv_name_2_0, 
                    		"ID");
            	    

            }


            }

            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:275:2: (otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) ) )?
            int alt5=2;
            int LA5_0 = input.LA(1);

            if ( (LA5_0==16) ) {
                alt5=1;
            }
            switch (alt5) {
                case 1 :
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:275:4: otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) )
                    {
                    otherlv_3=(Token)match(input,16,FOLLOW_16_in_ruleKM3Class577); 

                        	newLeafNode(otherlv_3, grammarAccess.getKM3ClassAccess().getExtendsKeyword_3_0());
                        
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:279:1: ( (otherlv_4= RULE_ID ) )
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:280:1: (otherlv_4= RULE_ID )
                    {
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:280:1: (otherlv_4= RULE_ID )
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:281:3: otherlv_4= RULE_ID
                    {

                    			if (current==null) {
                    	            current = createModelElement(grammarAccess.getKM3ClassRule());
                    	        }
                            
                    otherlv_4=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleKM3Class597); 

                    		newLeafNode(otherlv_4, grammarAccess.getKM3ClassAccess().getSuperTypeKM3ClassCrossReference_3_1_0()); 
                    	

                    }


                    }


                    }
                    break;

            }

            otherlv_5=(Token)match(input,12,FOLLOW_12_in_ruleKM3Class611); 

                	newLeafNode(otherlv_5, grammarAccess.getKM3ClassAccess().getLeftCurlyBracketKeyword_4());
                
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:296:1: ( (lv_features_6_0= ruleFeature ) )*
            loop6:
            do {
                int alt6=2;
                int LA6_0 = input.LA(1);

                if ( (LA6_0==17||LA6_0==20) ) {
                    alt6=1;
                }


                switch (alt6) {
            	case 1 :
            	    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:297:1: (lv_features_6_0= ruleFeature )
            	    {
            	    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:297:1: (lv_features_6_0= ruleFeature )
            	    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:298:3: lv_features_6_0= ruleFeature
            	    {
            	     
            	    	        newCompositeNode(grammarAccess.getKM3ClassAccess().getFeaturesFeatureParserRuleCall_5_0()); 
            	    	    
            	    pushFollow(FOLLOW_ruleFeature_in_ruleKM3Class632);
            	    lv_features_6_0=ruleFeature();

            	    state._fsp--;


            	    	        if (current==null) {
            	    	            current = createModelElementForParent(grammarAccess.getKM3ClassRule());
            	    	        }
            	           		add(
            	           			current, 
            	           			"features",
            	            		lv_features_6_0, 
            	            		"Feature");
            	    	        afterParserOrEnumRuleCall();
            	    	    

            	    }


            	    }
            	    break;

            	default :
            	    break loop6;
                }
            } while (true);

            otherlv_7=(Token)match(input,13,FOLLOW_13_in_ruleKM3Class645); 

                	newLeafNode(otherlv_7, grammarAccess.getKM3ClassAccess().getRightCurlyBracketKeyword_6());
                

            }


            }

             leaveRule(); 
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleKM3Class"


    // $ANTLR start "entryRuleFeature"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:326:1: entryRuleFeature returns [EObject current=null] : iv_ruleFeature= ruleFeature EOF ;
    public final EObject entryRuleFeature() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleFeature = null;


        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:327:2: (iv_ruleFeature= ruleFeature EOF )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:328:2: iv_ruleFeature= ruleFeature EOF
            {
             newCompositeNode(grammarAccess.getFeatureRule()); 
            pushFollow(FOLLOW_ruleFeature_in_entryRuleFeature681);
            iv_ruleFeature=ruleFeature();

            state._fsp--;

             current =iv_ruleFeature; 
            match(input,EOF,FOLLOW_EOF_in_entryRuleFeature691); 

            }

        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleFeature"


    // $ANTLR start "ruleFeature"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:335:1: ruleFeature returns [EObject current=null] : (this_Attribute_0= ruleAttribute | this_Reference_1= ruleReference ) ;
    public final EObject ruleFeature() throws RecognitionException {
        EObject current = null;

        EObject this_Attribute_0 = null;

        EObject this_Reference_1 = null;


         enterRule(); 
            
        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:338:28: ( (this_Attribute_0= ruleAttribute | this_Reference_1= ruleReference ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:339:1: (this_Attribute_0= ruleAttribute | this_Reference_1= ruleReference )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:339:1: (this_Attribute_0= ruleAttribute | this_Reference_1= ruleReference )
            int alt7=2;
            int LA7_0 = input.LA(1);

            if ( (LA7_0==17) ) {
                alt7=1;
            }
            else if ( (LA7_0==20) ) {
                alt7=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 7, 0, input);

                throw nvae;
            }
            switch (alt7) {
                case 1 :
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:340:5: this_Attribute_0= ruleAttribute
                    {
                     
                            newCompositeNode(grammarAccess.getFeatureAccess().getAttributeParserRuleCall_0()); 
                        
                    pushFollow(FOLLOW_ruleAttribute_in_ruleFeature738);
                    this_Attribute_0=ruleAttribute();

                    state._fsp--;

                     
                            current = this_Attribute_0; 
                            afterParserOrEnumRuleCall();
                        

                    }
                    break;
                case 2 :
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:350:5: this_Reference_1= ruleReference
                    {
                     
                            newCompositeNode(grammarAccess.getFeatureAccess().getReferenceParserRuleCall_1()); 
                        
                    pushFollow(FOLLOW_ruleReference_in_ruleFeature765);
                    this_Reference_1=ruleReference();

                    state._fsp--;

                     
                            current = this_Reference_1; 
                            afterParserOrEnumRuleCall();
                        

                    }
                    break;

            }


            }

             leaveRule(); 
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleFeature"


    // $ANTLR start "entryRuleAttribute"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:366:1: entryRuleAttribute returns [EObject current=null] : iv_ruleAttribute= ruleAttribute EOF ;
    public final EObject entryRuleAttribute() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttribute = null;


        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:367:2: (iv_ruleAttribute= ruleAttribute EOF )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:368:2: iv_ruleAttribute= ruleAttribute EOF
            {
             newCompositeNode(grammarAccess.getAttributeRule()); 
            pushFollow(FOLLOW_ruleAttribute_in_entryRuleAttribute800);
            iv_ruleAttribute=ruleAttribute();

            state._fsp--;

             current =iv_ruleAttribute; 
            match(input,EOF,FOLLOW_EOF_in_entryRuleAttribute810); 

            }

        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttribute"


    // $ANTLR start "ruleAttribute"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:375:1: ruleAttribute returns [EObject current=null] : (otherlv_0= 'attribute' ( (lv_name_1_0= RULE_ID ) ) ( (lv_multiplicity_2_0= ruleMultiplicity ) )? otherlv_3= ':' ( (lv_typeRef_4_0= ruleTypeRef ) ) otherlv_5= ';' ) ;
    public final EObject ruleAttribute() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_multiplicity_2_0 = null;

        EObject lv_typeRef_4_0 = null;


         enterRule(); 
            
        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:378:28: ( (otherlv_0= 'attribute' ( (lv_name_1_0= RULE_ID ) ) ( (lv_multiplicity_2_0= ruleMultiplicity ) )? otherlv_3= ':' ( (lv_typeRef_4_0= ruleTypeRef ) ) otherlv_5= ';' ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:379:1: (otherlv_0= 'attribute' ( (lv_name_1_0= RULE_ID ) ) ( (lv_multiplicity_2_0= ruleMultiplicity ) )? otherlv_3= ':' ( (lv_typeRef_4_0= ruleTypeRef ) ) otherlv_5= ';' )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:379:1: (otherlv_0= 'attribute' ( (lv_name_1_0= RULE_ID ) ) ( (lv_multiplicity_2_0= ruleMultiplicity ) )? otherlv_3= ':' ( (lv_typeRef_4_0= ruleTypeRef ) ) otherlv_5= ';' )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:379:3: otherlv_0= 'attribute' ( (lv_name_1_0= RULE_ID ) ) ( (lv_multiplicity_2_0= ruleMultiplicity ) )? otherlv_3= ':' ( (lv_typeRef_4_0= ruleTypeRef ) ) otherlv_5= ';'
            {
            otherlv_0=(Token)match(input,17,FOLLOW_17_in_ruleAttribute847); 

                	newLeafNode(otherlv_0, grammarAccess.getAttributeAccess().getAttributeKeyword_0());
                
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:383:1: ( (lv_name_1_0= RULE_ID ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:384:1: (lv_name_1_0= RULE_ID )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:384:1: (lv_name_1_0= RULE_ID )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:385:3: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleAttribute864); 

            			newLeafNode(lv_name_1_0, grammarAccess.getAttributeAccess().getNameIDTerminalRuleCall_1_0()); 
            		

            	        if (current==null) {
            	            current = createModelElement(grammarAccess.getAttributeRule());
            	        }
                   		setWithLastConsumed(
                   			current, 
                   			"name",
                    		lv_name_1_0, 
                    		"ID");
            	    

            }


            }

            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:401:2: ( (lv_multiplicity_2_0= ruleMultiplicity ) )?
            int alt8=2;
            int LA8_0 = input.LA(1);

            if ( (LA8_0==23) ) {
                alt8=1;
            }
            switch (alt8) {
                case 1 :
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:402:1: (lv_multiplicity_2_0= ruleMultiplicity )
                    {
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:402:1: (lv_multiplicity_2_0= ruleMultiplicity )
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:403:3: lv_multiplicity_2_0= ruleMultiplicity
                    {
                     
                    	        newCompositeNode(grammarAccess.getAttributeAccess().getMultiplicityMultiplicityParserRuleCall_2_0()); 
                    	    
                    pushFollow(FOLLOW_ruleMultiplicity_in_ruleAttribute890);
                    lv_multiplicity_2_0=ruleMultiplicity();

                    state._fsp--;


                    	        if (current==null) {
                    	            current = createModelElementForParent(grammarAccess.getAttributeRule());
                    	        }
                           		set(
                           			current, 
                           			"multiplicity",
                            		lv_multiplicity_2_0, 
                            		"Multiplicity");
                    	        afterParserOrEnumRuleCall();
                    	    

                    }


                    }
                    break;

            }

            otherlv_3=(Token)match(input,18,FOLLOW_18_in_ruleAttribute903); 

                	newLeafNode(otherlv_3, grammarAccess.getAttributeAccess().getColonKeyword_3());
                
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:423:1: ( (lv_typeRef_4_0= ruleTypeRef ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:424:1: (lv_typeRef_4_0= ruleTypeRef )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:424:1: (lv_typeRef_4_0= ruleTypeRef )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:425:3: lv_typeRef_4_0= ruleTypeRef
            {
             
            	        newCompositeNode(grammarAccess.getAttributeAccess().getTypeRefTypeRefParserRuleCall_4_0()); 
            	    
            pushFollow(FOLLOW_ruleTypeRef_in_ruleAttribute924);
            lv_typeRef_4_0=ruleTypeRef();

            state._fsp--;


            	        if (current==null) {
            	            current = createModelElementForParent(grammarAccess.getAttributeRule());
            	        }
                   		add(
                   			current, 
                   			"typeRef",
                    		lv_typeRef_4_0, 
                    		"TypeRef");
            	        afterParserOrEnumRuleCall();
            	    

            }


            }

            otherlv_5=(Token)match(input,19,FOLLOW_19_in_ruleAttribute936); 

                	newLeafNode(otherlv_5, grammarAccess.getAttributeAccess().getSemicolonKeyword_5());
                

            }


            }

             leaveRule(); 
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttribute"


    // $ANTLR start "entryRuleTypeRef"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:453:1: entryRuleTypeRef returns [EObject current=null] : iv_ruleTypeRef= ruleTypeRef EOF ;
    public final EObject entryRuleTypeRef() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeRef = null;


        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:454:2: (iv_ruleTypeRef= ruleTypeRef EOF )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:455:2: iv_ruleTypeRef= ruleTypeRef EOF
            {
             newCompositeNode(grammarAccess.getTypeRefRule()); 
            pushFollow(FOLLOW_ruleTypeRef_in_entryRuleTypeRef972);
            iv_ruleTypeRef=ruleTypeRef();

            state._fsp--;

             current =iv_ruleTypeRef; 
            match(input,EOF,FOLLOW_EOF_in_entryRuleTypeRef982); 

            }

        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTypeRef"


    // $ANTLR start "ruleTypeRef"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:462:1: ruleTypeRef returns [EObject current=null] : ( (otherlv_0= RULE_ID ) ) ;
    public final EObject ruleTypeRef() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;

         enterRule(); 
            
        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:465:28: ( ( (otherlv_0= RULE_ID ) ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:466:1: ( (otherlv_0= RULE_ID ) )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:466:1: ( (otherlv_0= RULE_ID ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:467:1: (otherlv_0= RULE_ID )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:467:1: (otherlv_0= RULE_ID )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:468:3: otherlv_0= RULE_ID
            {

            			if (current==null) {
            	            current = createModelElement(grammarAccess.getTypeRefRule());
            	        }
                    
            otherlv_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleTypeRef1026); 

            		newLeafNode(otherlv_0, grammarAccess.getTypeRefAccess().getTypeClassifierCrossReference_0()); 
            	

            }


            }


            }

             leaveRule(); 
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTypeRef"


    // $ANTLR start "entryRuleReference"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:487:1: entryRuleReference returns [EObject current=null] : iv_ruleReference= ruleReference EOF ;
    public final EObject entryRuleReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleReference = null;


        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:488:2: (iv_ruleReference= ruleReference EOF )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:489:2: iv_ruleReference= ruleReference EOF
            {
             newCompositeNode(grammarAccess.getReferenceRule()); 
            pushFollow(FOLLOW_ruleReference_in_entryRuleReference1061);
            iv_ruleReference=ruleReference();

            state._fsp--;

             current =iv_ruleReference; 
            match(input,EOF,FOLLOW_EOF_in_entryRuleReference1071); 

            }

        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleReference"


    // $ANTLR start "ruleReference"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:496:1: ruleReference returns [EObject current=null] : (otherlv_0= 'reference' ( (lv_name_1_0= RULE_ID ) ) ( (lv_multiplicity_2_0= ruleMultiplicity ) )? ( (lv_container_3_0= 'container' ) )? otherlv_4= ':' ( (lv_typeRef_5_0= ruleTypeRef ) ) (otherlv_6= 'oppositeOf' ( (otherlv_7= RULE_ID ) ) )? otherlv_8= ';' ) ;
    public final EObject ruleReference() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token lv_container_3_0=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        EObject lv_multiplicity_2_0 = null;

        EObject lv_typeRef_5_0 = null;


         enterRule(); 
            
        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:499:28: ( (otherlv_0= 'reference' ( (lv_name_1_0= RULE_ID ) ) ( (lv_multiplicity_2_0= ruleMultiplicity ) )? ( (lv_container_3_0= 'container' ) )? otherlv_4= ':' ( (lv_typeRef_5_0= ruleTypeRef ) ) (otherlv_6= 'oppositeOf' ( (otherlv_7= RULE_ID ) ) )? otherlv_8= ';' ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:500:1: (otherlv_0= 'reference' ( (lv_name_1_0= RULE_ID ) ) ( (lv_multiplicity_2_0= ruleMultiplicity ) )? ( (lv_container_3_0= 'container' ) )? otherlv_4= ':' ( (lv_typeRef_5_0= ruleTypeRef ) ) (otherlv_6= 'oppositeOf' ( (otherlv_7= RULE_ID ) ) )? otherlv_8= ';' )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:500:1: (otherlv_0= 'reference' ( (lv_name_1_0= RULE_ID ) ) ( (lv_multiplicity_2_0= ruleMultiplicity ) )? ( (lv_container_3_0= 'container' ) )? otherlv_4= ':' ( (lv_typeRef_5_0= ruleTypeRef ) ) (otherlv_6= 'oppositeOf' ( (otherlv_7= RULE_ID ) ) )? otherlv_8= ';' )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:500:3: otherlv_0= 'reference' ( (lv_name_1_0= RULE_ID ) ) ( (lv_multiplicity_2_0= ruleMultiplicity ) )? ( (lv_container_3_0= 'container' ) )? otherlv_4= ':' ( (lv_typeRef_5_0= ruleTypeRef ) ) (otherlv_6= 'oppositeOf' ( (otherlv_7= RULE_ID ) ) )? otherlv_8= ';'
            {
            otherlv_0=(Token)match(input,20,FOLLOW_20_in_ruleReference1108); 

                	newLeafNode(otherlv_0, grammarAccess.getReferenceAccess().getReferenceKeyword_0());
                
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:504:1: ( (lv_name_1_0= RULE_ID ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:505:1: (lv_name_1_0= RULE_ID )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:505:1: (lv_name_1_0= RULE_ID )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:506:3: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleReference1125); 

            			newLeafNode(lv_name_1_0, grammarAccess.getReferenceAccess().getNameIDTerminalRuleCall_1_0()); 
            		

            	        if (current==null) {
            	            current = createModelElement(grammarAccess.getReferenceRule());
            	        }
                   		setWithLastConsumed(
                   			current, 
                   			"name",
                    		lv_name_1_0, 
                    		"ID");
            	    

            }


            }

            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:522:2: ( (lv_multiplicity_2_0= ruleMultiplicity ) )?
            int alt9=2;
            int LA9_0 = input.LA(1);

            if ( (LA9_0==23) ) {
                alt9=1;
            }
            switch (alt9) {
                case 1 :
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:523:1: (lv_multiplicity_2_0= ruleMultiplicity )
                    {
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:523:1: (lv_multiplicity_2_0= ruleMultiplicity )
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:524:3: lv_multiplicity_2_0= ruleMultiplicity
                    {
                     
                    	        newCompositeNode(grammarAccess.getReferenceAccess().getMultiplicityMultiplicityParserRuleCall_2_0()); 
                    	    
                    pushFollow(FOLLOW_ruleMultiplicity_in_ruleReference1151);
                    lv_multiplicity_2_0=ruleMultiplicity();

                    state._fsp--;


                    	        if (current==null) {
                    	            current = createModelElementForParent(grammarAccess.getReferenceRule());
                    	        }
                           		set(
                           			current, 
                           			"multiplicity",
                            		lv_multiplicity_2_0, 
                            		"Multiplicity");
                    	        afterParserOrEnumRuleCall();
                    	    

                    }


                    }
                    break;

            }

            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:540:3: ( (lv_container_3_0= 'container' ) )?
            int alt10=2;
            int LA10_0 = input.LA(1);

            if ( (LA10_0==21) ) {
                alt10=1;
            }
            switch (alt10) {
                case 1 :
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:541:1: (lv_container_3_0= 'container' )
                    {
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:541:1: (lv_container_3_0= 'container' )
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:542:3: lv_container_3_0= 'container'
                    {
                    lv_container_3_0=(Token)match(input,21,FOLLOW_21_in_ruleReference1170); 

                            newLeafNode(lv_container_3_0, grammarAccess.getReferenceAccess().getContainerContainerKeyword_3_0());
                        

                    	        if (current==null) {
                    	            current = createModelElement(grammarAccess.getReferenceRule());
                    	        }
                           		setWithLastConsumed(current, "container", true, "container");
                    	    

                    }


                    }
                    break;

            }

            otherlv_4=(Token)match(input,18,FOLLOW_18_in_ruleReference1196); 

                	newLeafNode(otherlv_4, grammarAccess.getReferenceAccess().getColonKeyword_4());
                
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:559:1: ( (lv_typeRef_5_0= ruleTypeRef ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:560:1: (lv_typeRef_5_0= ruleTypeRef )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:560:1: (lv_typeRef_5_0= ruleTypeRef )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:561:3: lv_typeRef_5_0= ruleTypeRef
            {
             
            	        newCompositeNode(grammarAccess.getReferenceAccess().getTypeRefTypeRefParserRuleCall_5_0()); 
            	    
            pushFollow(FOLLOW_ruleTypeRef_in_ruleReference1217);
            lv_typeRef_5_0=ruleTypeRef();

            state._fsp--;


            	        if (current==null) {
            	            current = createModelElementForParent(grammarAccess.getReferenceRule());
            	        }
                   		add(
                   			current, 
                   			"typeRef",
                    		lv_typeRef_5_0, 
                    		"TypeRef");
            	        afterParserOrEnumRuleCall();
            	    

            }


            }

            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:577:2: (otherlv_6= 'oppositeOf' ( (otherlv_7= RULE_ID ) ) )?
            int alt11=2;
            int LA11_0 = input.LA(1);

            if ( (LA11_0==22) ) {
                alt11=1;
            }
            switch (alt11) {
                case 1 :
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:577:4: otherlv_6= 'oppositeOf' ( (otherlv_7= RULE_ID ) )
                    {
                    otherlv_6=(Token)match(input,22,FOLLOW_22_in_ruleReference1230); 

                        	newLeafNode(otherlv_6, grammarAccess.getReferenceAccess().getOppositeOfKeyword_6_0());
                        
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:581:1: ( (otherlv_7= RULE_ID ) )
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:582:1: (otherlv_7= RULE_ID )
                    {
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:582:1: (otherlv_7= RULE_ID )
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:583:3: otherlv_7= RULE_ID
                    {

                    			if (current==null) {
                    	            current = createModelElement(grammarAccess.getReferenceRule());
                    	        }
                            
                    otherlv_7=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleReference1250); 

                    		newLeafNode(otherlv_7, grammarAccess.getReferenceAccess().getOppositeReferenceCrossReference_6_1_0()); 
                    	

                    }


                    }


                    }
                    break;

            }

            otherlv_8=(Token)match(input,19,FOLLOW_19_in_ruleReference1264); 

                	newLeafNode(otherlv_8, grammarAccess.getReferenceAccess().getSemicolonKeyword_7());
                

            }


            }

             leaveRule(); 
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleReference"


    // $ANTLR start "entryRuleMultiplicity"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:606:1: entryRuleMultiplicity returns [EObject current=null] : iv_ruleMultiplicity= ruleMultiplicity EOF ;
    public final EObject entryRuleMultiplicity() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMultiplicity = null;


        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:607:2: (iv_ruleMultiplicity= ruleMultiplicity EOF )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:608:2: iv_ruleMultiplicity= ruleMultiplicity EOF
            {
             newCompositeNode(grammarAccess.getMultiplicityRule()); 
            pushFollow(FOLLOW_ruleMultiplicity_in_entryRuleMultiplicity1300);
            iv_ruleMultiplicity=ruleMultiplicity();

            state._fsp--;

             current =iv_ruleMultiplicity; 
            match(input,EOF,FOLLOW_EOF_in_entryRuleMultiplicity1310); 

            }

        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleMultiplicity"


    // $ANTLR start "ruleMultiplicity"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:615:1: ruleMultiplicity returns [EObject current=null] : (otherlv_0= '[' ( ( ( (lv_lowerBound_1_0= RULE_INT ) ) (otherlv_2= '-' ( ( (lv_upperBound_3_0= RULE_INT ) ) | otherlv_4= '*' ) )? ) | ( (lv_unbounded_5_0= '*' ) ) ) otherlv_6= ']' ( (lv_ordered_7_0= 'ordered' ) )? ) ;
    public final EObject ruleMultiplicity() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_lowerBound_1_0=null;
        Token otherlv_2=null;
        Token lv_upperBound_3_0=null;
        Token otherlv_4=null;
        Token lv_unbounded_5_0=null;
        Token otherlv_6=null;
        Token lv_ordered_7_0=null;

         enterRule(); 
            
        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:618:28: ( (otherlv_0= '[' ( ( ( (lv_lowerBound_1_0= RULE_INT ) ) (otherlv_2= '-' ( ( (lv_upperBound_3_0= RULE_INT ) ) | otherlv_4= '*' ) )? ) | ( (lv_unbounded_5_0= '*' ) ) ) otherlv_6= ']' ( (lv_ordered_7_0= 'ordered' ) )? ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:619:1: (otherlv_0= '[' ( ( ( (lv_lowerBound_1_0= RULE_INT ) ) (otherlv_2= '-' ( ( (lv_upperBound_3_0= RULE_INT ) ) | otherlv_4= '*' ) )? ) | ( (lv_unbounded_5_0= '*' ) ) ) otherlv_6= ']' ( (lv_ordered_7_0= 'ordered' ) )? )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:619:1: (otherlv_0= '[' ( ( ( (lv_lowerBound_1_0= RULE_INT ) ) (otherlv_2= '-' ( ( (lv_upperBound_3_0= RULE_INT ) ) | otherlv_4= '*' ) )? ) | ( (lv_unbounded_5_0= '*' ) ) ) otherlv_6= ']' ( (lv_ordered_7_0= 'ordered' ) )? )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:619:3: otherlv_0= '[' ( ( ( (lv_lowerBound_1_0= RULE_INT ) ) (otherlv_2= '-' ( ( (lv_upperBound_3_0= RULE_INT ) ) | otherlv_4= '*' ) )? ) | ( (lv_unbounded_5_0= '*' ) ) ) otherlv_6= ']' ( (lv_ordered_7_0= 'ordered' ) )?
            {
            otherlv_0=(Token)match(input,23,FOLLOW_23_in_ruleMultiplicity1347); 

                	newLeafNode(otherlv_0, grammarAccess.getMultiplicityAccess().getLeftSquareBracketKeyword_0());
                
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:623:1: ( ( ( (lv_lowerBound_1_0= RULE_INT ) ) (otherlv_2= '-' ( ( (lv_upperBound_3_0= RULE_INT ) ) | otherlv_4= '*' ) )? ) | ( (lv_unbounded_5_0= '*' ) ) )
            int alt14=2;
            int LA14_0 = input.LA(1);

            if ( (LA14_0==RULE_INT) ) {
                alt14=1;
            }
            else if ( (LA14_0==25) ) {
                alt14=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 14, 0, input);

                throw nvae;
            }
            switch (alt14) {
                case 1 :
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:623:2: ( ( (lv_lowerBound_1_0= RULE_INT ) ) (otherlv_2= '-' ( ( (lv_upperBound_3_0= RULE_INT ) ) | otherlv_4= '*' ) )? )
                    {
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:623:2: ( ( (lv_lowerBound_1_0= RULE_INT ) ) (otherlv_2= '-' ( ( (lv_upperBound_3_0= RULE_INT ) ) | otherlv_4= '*' ) )? )
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:623:3: ( (lv_lowerBound_1_0= RULE_INT ) ) (otherlv_2= '-' ( ( (lv_upperBound_3_0= RULE_INT ) ) | otherlv_4= '*' ) )?
                    {
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:623:3: ( (lv_lowerBound_1_0= RULE_INT ) )
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:624:1: (lv_lowerBound_1_0= RULE_INT )
                    {
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:624:1: (lv_lowerBound_1_0= RULE_INT )
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:625:3: lv_lowerBound_1_0= RULE_INT
                    {
                    lv_lowerBound_1_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleMultiplicity1366); 

                    			newLeafNode(lv_lowerBound_1_0, grammarAccess.getMultiplicityAccess().getLowerBoundINTTerminalRuleCall_1_0_0_0()); 
                    		

                    	        if (current==null) {
                    	            current = createModelElement(grammarAccess.getMultiplicityRule());
                    	        }
                           		setWithLastConsumed(
                           			current, 
                           			"lowerBound",
                            		lv_lowerBound_1_0, 
                            		"INT");
                    	    

                    }


                    }

                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:641:2: (otherlv_2= '-' ( ( (lv_upperBound_3_0= RULE_INT ) ) | otherlv_4= '*' ) )?
                    int alt13=2;
                    int LA13_0 = input.LA(1);

                    if ( (LA13_0==24) ) {
                        alt13=1;
                    }
                    switch (alt13) {
                        case 1 :
                            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:641:4: otherlv_2= '-' ( ( (lv_upperBound_3_0= RULE_INT ) ) | otherlv_4= '*' )
                            {
                            otherlv_2=(Token)match(input,24,FOLLOW_24_in_ruleMultiplicity1384); 

                                	newLeafNode(otherlv_2, grammarAccess.getMultiplicityAccess().getHyphenMinusKeyword_1_0_1_0());
                                
                            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:645:1: ( ( (lv_upperBound_3_0= RULE_INT ) ) | otherlv_4= '*' )
                            int alt12=2;
                            int LA12_0 = input.LA(1);

                            if ( (LA12_0==RULE_INT) ) {
                                alt12=1;
                            }
                            else if ( (LA12_0==25) ) {
                                alt12=2;
                            }
                            else {
                                NoViableAltException nvae =
                                    new NoViableAltException("", 12, 0, input);

                                throw nvae;
                            }
                            switch (alt12) {
                                case 1 :
                                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:645:2: ( (lv_upperBound_3_0= RULE_INT ) )
                                    {
                                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:645:2: ( (lv_upperBound_3_0= RULE_INT ) )
                                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:646:1: (lv_upperBound_3_0= RULE_INT )
                                    {
                                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:646:1: (lv_upperBound_3_0= RULE_INT )
                                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:647:3: lv_upperBound_3_0= RULE_INT
                                    {
                                    lv_upperBound_3_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleMultiplicity1402); 

                                    			newLeafNode(lv_upperBound_3_0, grammarAccess.getMultiplicityAccess().getUpperBoundINTTerminalRuleCall_1_0_1_1_0_0()); 
                                    		

                                    	        if (current==null) {
                                    	            current = createModelElement(grammarAccess.getMultiplicityRule());
                                    	        }
                                           		setWithLastConsumed(
                                           			current, 
                                           			"upperBound",
                                            		lv_upperBound_3_0, 
                                            		"INT");
                                    	    

                                    }


                                    }


                                    }
                                    break;
                                case 2 :
                                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:664:7: otherlv_4= '*'
                                    {
                                    otherlv_4=(Token)match(input,25,FOLLOW_25_in_ruleMultiplicity1425); 

                                        	newLeafNode(otherlv_4, grammarAccess.getMultiplicityAccess().getAsteriskKeyword_1_0_1_1_1());
                                        

                                    }
                                    break;

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:669:6: ( (lv_unbounded_5_0= '*' ) )
                    {
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:669:6: ( (lv_unbounded_5_0= '*' ) )
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:670:1: (lv_unbounded_5_0= '*' )
                    {
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:670:1: (lv_unbounded_5_0= '*' )
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:671:3: lv_unbounded_5_0= '*'
                    {
                    lv_unbounded_5_0=(Token)match(input,25,FOLLOW_25_in_ruleMultiplicity1453); 

                            newLeafNode(lv_unbounded_5_0, grammarAccess.getMultiplicityAccess().getUnboundedAsteriskKeyword_1_1_0());
                        

                    	        if (current==null) {
                    	            current = createModelElement(grammarAccess.getMultiplicityRule());
                    	        }
                           		setWithLastConsumed(current, "unbounded", true, "*");
                    	    

                    }


                    }


                    }
                    break;

            }

            otherlv_6=(Token)match(input,26,FOLLOW_26_in_ruleMultiplicity1479); 

                	newLeafNode(otherlv_6, grammarAccess.getMultiplicityAccess().getRightSquareBracketKeyword_2());
                
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:688:1: ( (lv_ordered_7_0= 'ordered' ) )?
            int alt15=2;
            int LA15_0 = input.LA(1);

            if ( (LA15_0==27) ) {
                alt15=1;
            }
            switch (alt15) {
                case 1 :
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:689:1: (lv_ordered_7_0= 'ordered' )
                    {
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:689:1: (lv_ordered_7_0= 'ordered' )
                    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:690:3: lv_ordered_7_0= 'ordered'
                    {
                    lv_ordered_7_0=(Token)match(input,27,FOLLOW_27_in_ruleMultiplicity1497); 

                            newLeafNode(lv_ordered_7_0, grammarAccess.getMultiplicityAccess().getOrderedOrderedKeyword_3_0());
                        

                    	        if (current==null) {
                    	            current = createModelElement(grammarAccess.getMultiplicityRule());
                    	        }
                           		setWithLastConsumed(current, "ordered", true, "ordered");
                    	    

                    }


                    }
                    break;

            }


            }


            }

             leaveRule(); 
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleMultiplicity"


    // $ANTLR start "entryRuleDatatype"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:711:1: entryRuleDatatype returns [EObject current=null] : iv_ruleDatatype= ruleDatatype EOF ;
    public final EObject entryRuleDatatype() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatatype = null;


        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:712:2: (iv_ruleDatatype= ruleDatatype EOF )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:713:2: iv_ruleDatatype= ruleDatatype EOF
            {
             newCompositeNode(grammarAccess.getDatatypeRule()); 
            pushFollow(FOLLOW_ruleDatatype_in_entryRuleDatatype1547);
            iv_ruleDatatype=ruleDatatype();

            state._fsp--;

             current =iv_ruleDatatype; 
            match(input,EOF,FOLLOW_EOF_in_entryRuleDatatype1557); 

            }

        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatatype"


    // $ANTLR start "ruleDatatype"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:720:1: ruleDatatype returns [EObject current=null] : ( ( (lv_datatype_0_0= 'datatype' ) ) ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ';' ) ;
    public final EObject ruleDatatype() throws RecognitionException {
        EObject current = null;

        Token lv_datatype_0_0=null;
        Token lv_name_1_0=null;
        Token otherlv_2=null;

         enterRule(); 
            
        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:723:28: ( ( ( (lv_datatype_0_0= 'datatype' ) ) ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ';' ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:724:1: ( ( (lv_datatype_0_0= 'datatype' ) ) ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ';' )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:724:1: ( ( (lv_datatype_0_0= 'datatype' ) ) ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ';' )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:724:2: ( (lv_datatype_0_0= 'datatype' ) ) ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ';'
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:724:2: ( (lv_datatype_0_0= 'datatype' ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:725:1: (lv_datatype_0_0= 'datatype' )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:725:1: (lv_datatype_0_0= 'datatype' )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:726:3: lv_datatype_0_0= 'datatype'
            {
            lv_datatype_0_0=(Token)match(input,28,FOLLOW_28_in_ruleDatatype1600); 

                    newLeafNode(lv_datatype_0_0, grammarAccess.getDatatypeAccess().getDatatypeDatatypeKeyword_0_0());
                

            	        if (current==null) {
            	            current = createModelElement(grammarAccess.getDatatypeRule());
            	        }
                   		setWithLastConsumed(current, "datatype", lv_datatype_0_0, "datatype");
            	    

            }


            }

            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:739:2: ( (lv_name_1_0= RULE_ID ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:740:1: (lv_name_1_0= RULE_ID )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:740:1: (lv_name_1_0= RULE_ID )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:741:3: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleDatatype1630); 

            			newLeafNode(lv_name_1_0, grammarAccess.getDatatypeAccess().getNameIDTerminalRuleCall_1_0()); 
            		

            	        if (current==null) {
            	            current = createModelElement(grammarAccess.getDatatypeRule());
            	        }
                   		setWithLastConsumed(
                   			current, 
                   			"name",
                    		lv_name_1_0, 
                    		"ID");
            	    

            }


            }

            otherlv_2=(Token)match(input,19,FOLLOW_19_in_ruleDatatype1647); 

                	newLeafNode(otherlv_2, grammarAccess.getDatatypeAccess().getSemicolonKeyword_2());
                

            }


            }

             leaveRule(); 
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatatype"


    // $ANTLR start "entryRuleEnumeration"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:769:1: entryRuleEnumeration returns [EObject current=null] : iv_ruleEnumeration= ruleEnumeration EOF ;
    public final EObject entryRuleEnumeration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEnumeration = null;


        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:770:2: (iv_ruleEnumeration= ruleEnumeration EOF )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:771:2: iv_ruleEnumeration= ruleEnumeration EOF
            {
             newCompositeNode(grammarAccess.getEnumerationRule()); 
            pushFollow(FOLLOW_ruleEnumeration_in_entryRuleEnumeration1683);
            iv_ruleEnumeration=ruleEnumeration();

            state._fsp--;

             current =iv_ruleEnumeration; 
            match(input,EOF,FOLLOW_EOF_in_entryRuleEnumeration1693); 

            }

        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleEnumeration"


    // $ANTLR start "ruleEnumeration"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:778:1: ruleEnumeration returns [EObject current=null] : ( ( (lv_enumeration_0_0= 'enumeration' ) ) ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_literals_3_0= ruleLiteral ) )+ otherlv_4= '}' ) ;
    public final EObject ruleEnumeration() throws RecognitionException {
        EObject current = null;

        Token lv_enumeration_0_0=null;
        Token lv_name_1_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_literals_3_0 = null;


         enterRule(); 
            
        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:781:28: ( ( ( (lv_enumeration_0_0= 'enumeration' ) ) ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_literals_3_0= ruleLiteral ) )+ otherlv_4= '}' ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:782:1: ( ( (lv_enumeration_0_0= 'enumeration' ) ) ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_literals_3_0= ruleLiteral ) )+ otherlv_4= '}' )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:782:1: ( ( (lv_enumeration_0_0= 'enumeration' ) ) ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_literals_3_0= ruleLiteral ) )+ otherlv_4= '}' )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:782:2: ( (lv_enumeration_0_0= 'enumeration' ) ) ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_literals_3_0= ruleLiteral ) )+ otherlv_4= '}'
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:782:2: ( (lv_enumeration_0_0= 'enumeration' ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:783:1: (lv_enumeration_0_0= 'enumeration' )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:783:1: (lv_enumeration_0_0= 'enumeration' )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:784:3: lv_enumeration_0_0= 'enumeration'
            {
            lv_enumeration_0_0=(Token)match(input,29,FOLLOW_29_in_ruleEnumeration1736); 

                    newLeafNode(lv_enumeration_0_0, grammarAccess.getEnumerationAccess().getEnumerationEnumerationKeyword_0_0());
                

            	        if (current==null) {
            	            current = createModelElement(grammarAccess.getEnumerationRule());
            	        }
                   		setWithLastConsumed(current, "enumeration", lv_enumeration_0_0, "enumeration");
            	    

            }


            }

            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:797:2: ( (lv_name_1_0= RULE_ID ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:798:1: (lv_name_1_0= RULE_ID )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:798:1: (lv_name_1_0= RULE_ID )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:799:3: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleEnumeration1766); 

            			newLeafNode(lv_name_1_0, grammarAccess.getEnumerationAccess().getNameIDTerminalRuleCall_1_0()); 
            		

            	        if (current==null) {
            	            current = createModelElement(grammarAccess.getEnumerationRule());
            	        }
                   		setWithLastConsumed(
                   			current, 
                   			"name",
                    		lv_name_1_0, 
                    		"ID");
            	    

            }


            }

            otherlv_2=(Token)match(input,12,FOLLOW_12_in_ruleEnumeration1783); 

                	newLeafNode(otherlv_2, grammarAccess.getEnumerationAccess().getLeftCurlyBracketKeyword_2());
                
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:819:1: ( (lv_literals_3_0= ruleLiteral ) )+
            int cnt16=0;
            loop16:
            do {
                int alt16=2;
                int LA16_0 = input.LA(1);

                if ( (LA16_0==30) ) {
                    alt16=1;
                }


                switch (alt16) {
            	case 1 :
            	    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:820:1: (lv_literals_3_0= ruleLiteral )
            	    {
            	    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:820:1: (lv_literals_3_0= ruleLiteral )
            	    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:821:3: lv_literals_3_0= ruleLiteral
            	    {
            	     
            	    	        newCompositeNode(grammarAccess.getEnumerationAccess().getLiteralsLiteralParserRuleCall_3_0()); 
            	    	    
            	    pushFollow(FOLLOW_ruleLiteral_in_ruleEnumeration1804);
            	    lv_literals_3_0=ruleLiteral();

            	    state._fsp--;


            	    	        if (current==null) {
            	    	            current = createModelElementForParent(grammarAccess.getEnumerationRule());
            	    	        }
            	           		add(
            	           			current, 
            	           			"literals",
            	            		lv_literals_3_0, 
            	            		"Literal");
            	    	        afterParserOrEnumRuleCall();
            	    	    

            	    }


            	    }
            	    break;

            	default :
            	    if ( cnt16 >= 1 ) break loop16;
                        EarlyExitException eee =
                            new EarlyExitException(16, input);
                        throw eee;
                }
                cnt16++;
            } while (true);

            otherlv_4=(Token)match(input,13,FOLLOW_13_in_ruleEnumeration1817); 

                	newLeafNode(otherlv_4, grammarAccess.getEnumerationAccess().getRightCurlyBracketKeyword_4());
                

            }


            }

             leaveRule(); 
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleEnumeration"


    // $ANTLR start "entryRuleLiteral"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:849:1: entryRuleLiteral returns [EObject current=null] : iv_ruleLiteral= ruleLiteral EOF ;
    public final EObject entryRuleLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLiteral = null;


        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:850:2: (iv_ruleLiteral= ruleLiteral EOF )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:851:2: iv_ruleLiteral= ruleLiteral EOF
            {
             newCompositeNode(grammarAccess.getLiteralRule()); 
            pushFollow(FOLLOW_ruleLiteral_in_entryRuleLiteral1853);
            iv_ruleLiteral=ruleLiteral();

            state._fsp--;

             current =iv_ruleLiteral; 
            match(input,EOF,FOLLOW_EOF_in_entryRuleLiteral1863); 

            }

        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLiteral"


    // $ANTLR start "ruleLiteral"
    // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:858:1: ruleLiteral returns [EObject current=null] : (otherlv_0= 'literal' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ';' ) ;
    public final EObject ruleLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token otherlv_2=null;

         enterRule(); 
            
        try {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:861:28: ( (otherlv_0= 'literal' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ';' ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:862:1: (otherlv_0= 'literal' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ';' )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:862:1: (otherlv_0= 'literal' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ';' )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:862:3: otherlv_0= 'literal' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ';'
            {
            otherlv_0=(Token)match(input,30,FOLLOW_30_in_ruleLiteral1900); 

                	newLeafNode(otherlv_0, grammarAccess.getLiteralAccess().getLiteralKeyword_0());
                
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:866:1: ( (lv_name_1_0= RULE_ID ) )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:867:1: (lv_name_1_0= RULE_ID )
            {
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:867:1: (lv_name_1_0= RULE_ID )
            // ../org.dslintegration.KM3/src-gen/org/dslintegration/parser/antlr/internal/InternalKM3.g:868:3: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleLiteral1917); 

            			newLeafNode(lv_name_1_0, grammarAccess.getLiteralAccess().getNameIDTerminalRuleCall_1_0()); 
            		

            	        if (current==null) {
            	            current = createModelElement(grammarAccess.getLiteralRule());
            	        }
                   		setWithLastConsumed(
                   			current, 
                   			"name",
                    		lv_name_1_0, 
                    		"ID");
            	    

            }


            }

            otherlv_2=(Token)match(input,19,FOLLOW_19_in_ruleLiteral1934); 

                	newLeafNode(otherlv_2, grammarAccess.getLiteralAccess().getSemicolonKeyword_2());
                

            }


            }

             leaveRule(); 
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLiteral"

    // Delegated rules


 

    public static final BitSet FOLLOW_ruleMetamodel_in_entryRuleMetamodel75 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_EOF_in_entryRuleMetamodel85 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_rulePackage_in_ruleMetamodel130 = new BitSet(new long[]{0x0000000000000802L});
    public static final BitSet FOLLOW_rulePackage_in_entryRulePackage166 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_EOF_in_entryRulePackage176 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_11_in_rulePackage213 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_RULE_ID_in_rulePackage230 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_12_in_rulePackage247 = new BitSet(new long[]{0x000000003000E000L});
    public static final BitSet FOLLOW_ruleClassifier_in_rulePackage268 = new BitSet(new long[]{0x000000003000E000L});
    public static final BitSet FOLLOW_13_in_rulePackage281 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ruleClassifier_in_entryRuleClassifier317 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_EOF_in_entryRuleClassifier327 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ruleKM3Class_in_ruleClassifier374 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ruleDatatype_in_ruleClassifier401 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ruleEnumeration_in_ruleClassifier428 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ruleKM3Class_in_entryRuleKM3Class463 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_EOF_in_entryRuleKM3Class473 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_14_in_ruleKM3Class516 = new BitSet(new long[]{0x0000000000008000L});
    public static final BitSet FOLLOW_15_in_ruleKM3Class542 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_RULE_ID_in_ruleKM3Class559 = new BitSet(new long[]{0x0000000000011000L});
    public static final BitSet FOLLOW_16_in_ruleKM3Class577 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_RULE_ID_in_ruleKM3Class597 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_12_in_ruleKM3Class611 = new BitSet(new long[]{0x0000000000122000L});
    public static final BitSet FOLLOW_ruleFeature_in_ruleKM3Class632 = new BitSet(new long[]{0x0000000000122000L});
    public static final BitSet FOLLOW_13_in_ruleKM3Class645 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ruleFeature_in_entryRuleFeature681 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_EOF_in_entryRuleFeature691 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ruleAttribute_in_ruleFeature738 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ruleReference_in_ruleFeature765 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ruleAttribute_in_entryRuleAttribute800 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_EOF_in_entryRuleAttribute810 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_17_in_ruleAttribute847 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_RULE_ID_in_ruleAttribute864 = new BitSet(new long[]{0x0000000000840000L});
    public static final BitSet FOLLOW_ruleMultiplicity_in_ruleAttribute890 = new BitSet(new long[]{0x0000000000040000L});
    public static final BitSet FOLLOW_18_in_ruleAttribute903 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_ruleTypeRef_in_ruleAttribute924 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_19_in_ruleAttribute936 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ruleTypeRef_in_entryRuleTypeRef972 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_EOF_in_entryRuleTypeRef982 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_RULE_ID_in_ruleTypeRef1026 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ruleReference_in_entryRuleReference1061 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_EOF_in_entryRuleReference1071 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_20_in_ruleReference1108 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_RULE_ID_in_ruleReference1125 = new BitSet(new long[]{0x0000000000A40000L});
    public static final BitSet FOLLOW_ruleMultiplicity_in_ruleReference1151 = new BitSet(new long[]{0x0000000000240000L});
    public static final BitSet FOLLOW_21_in_ruleReference1170 = new BitSet(new long[]{0x0000000000040000L});
    public static final BitSet FOLLOW_18_in_ruleReference1196 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_ruleTypeRef_in_ruleReference1217 = new BitSet(new long[]{0x0000000000480000L});
    public static final BitSet FOLLOW_22_in_ruleReference1230 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_RULE_ID_in_ruleReference1250 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_19_in_ruleReference1264 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ruleMultiplicity_in_entryRuleMultiplicity1300 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_EOF_in_entryRuleMultiplicity1310 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_23_in_ruleMultiplicity1347 = new BitSet(new long[]{0x0000000002000020L});
    public static final BitSet FOLLOW_RULE_INT_in_ruleMultiplicity1366 = new BitSet(new long[]{0x0000000005000000L});
    public static final BitSet FOLLOW_24_in_ruleMultiplicity1384 = new BitSet(new long[]{0x0000000002000020L});
    public static final BitSet FOLLOW_RULE_INT_in_ruleMultiplicity1402 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_25_in_ruleMultiplicity1425 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_25_in_ruleMultiplicity1453 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_26_in_ruleMultiplicity1479 = new BitSet(new long[]{0x0000000008000002L});
    public static final BitSet FOLLOW_27_in_ruleMultiplicity1497 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ruleDatatype_in_entryRuleDatatype1547 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_EOF_in_entryRuleDatatype1557 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_28_in_ruleDatatype1600 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_RULE_ID_in_ruleDatatype1630 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_19_in_ruleDatatype1647 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ruleEnumeration_in_entryRuleEnumeration1683 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_EOF_in_entryRuleEnumeration1693 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_29_in_ruleEnumeration1736 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_RULE_ID_in_ruleEnumeration1766 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_12_in_ruleEnumeration1783 = new BitSet(new long[]{0x0000000040000000L});
    public static final BitSet FOLLOW_ruleLiteral_in_ruleEnumeration1804 = new BitSet(new long[]{0x0000000040002000L});
    public static final BitSet FOLLOW_13_in_ruleEnumeration1817 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ruleLiteral_in_entryRuleLiteral1853 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_EOF_in_entryRuleLiteral1863 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_30_in_ruleLiteral1900 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_RULE_ID_in_ruleLiteral1917 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_19_in_ruleLiteral1934 = new BitSet(new long[]{0x0000000000000002L});

}